package com.zmn.mcc.dubbo.interfaces.staff;

import com.zmn.common.dto.VtDTO;
import com.zmn.common.dto2.OptionData;
import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.common.dto.base.PageDRO;
import com.zmn.mcc.common.dto.cc.CCStaffDRO;
import com.zmn.mcc.common.dto.cc.UpdateQuery;
import com.zmn.mcc.common.dto.staff.*;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 员工信息服务
 *
 * @author heguanghua
 * @since 2020/06/04 15:17
 */
public interface StaffListRemoteService {

    /**
     * 取得指定员工信息对象
     *
     * @param staffId 员工ID
     * @return
     */
    ResponseDTO<StaffDRO> getStaff(Integer staffId);

    /**
     * 描述: 取得指定员工信息对象（排除电话信息）
     *
     * @param staffId
     * @return com.zmn.common.dto2.ResponseDTO<com.zmn.mcc.common.dto.staff.StaffDRO>
     * @author jiafei
     * @since 2021/11/12 16:17
     */
    ResponseDTO<StaffDRO> getStaffById(Integer staffId);

    /**
     * 描述: 取得指定员工的领导信息
     *
     * @param staffId
     * @return com.zmn.common.dto2.ResponseDTO<com.zmn.mcc.common.dto.staff.StaffDRO>
     * @author guoqiao
     * @since 2022/1/12 16:13
     */
    ResponseDTO<StaffDRO> getStaffLeaderById(Integer staffId);

    /**
     * 描述: 查询指定员工的下级员工
     *
     * @param staffId staffId
     * @return com.zmn.common.dto2.ResponseDTO<com.zmn.mcc.common.dto.staff.StaffDRO>
     * @author guoqiao
     * @since 2022/1/12 16:13
     */
    ResponseDTO<List<StaffDRO>> getSubStaffByLeaderId(Integer staffId);

    /**
     * 描述: 取得指定员工信息对象
     *
     * @param dingTalkId 钉钉id
     * @return com.zmn.common.dto2.ResponseDTO<com.zmn.mcc.common.dto.staff.StaffDRO>
     * @author jiafei
     * @since 2021/8/12 13:59
     */
    ResponseDTO<StaffDRO> getStaffByDingTalkId(String dingTalkId);

    /**
     * 根据员工id查询员工工作地城市
     *
     * @param staffId 员工ID
     * @return 工作地城市
     * @author xujie
     * @since 2021/03/16
     */
    ResponseDTO<Integer> getWorkPlaceCity(@ApiParam(value = "员工ID", required = true)
                                          @NotNull(message = "员工ID不能为空") Integer staffId);

    /**
     * 根据更新时间获取员工数据
     *
     * @param query
     * @return ResponseDTO<List < CCBaseAreaDro>>
     */
    @ApiOperation(value = "根据更新时间获取员工数据", response = ResponseDTO.class)
    ResponseDTO<List<CCStaffDRO>> listStaffByUpdateTime(@ApiParam(value = "查询条件", required = false) UpdateQuery query);

    /**
     * 根据指定查询入参对象取得员工vt对象列表
     *
     * @param query 员工查询入参对象 {@link StaffQueryDIO}
     * @return
     */
    ResponseDTO<List<VtDTO>> listStaffVtByQueryDIO(StaffQueryDIO query);

    /**
     * 根据指定查询入参对象取得员工列表
     *
     * @param query 员工查询入参对象 {@link StaffQueryDIO}
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByQueryDIO(StaffQueryDIO query);

    /**
     * 根据指定简化的查询入参对象取得员工vt对象列表
     *
     * @param query 简化的员工查询入参对象 {@link StaffSimpleQueryDIO}
     * @return
     */
    ResponseDTO<List<VtDTO>> listStaffVtBySimpleQueryDIO(StaffSimpleQueryDIO query);

    /**
     * 根据条件搜索查询部门下的所有员工(包含所有子部门，部门id列表必传)，返回员工vt对象列表
     *
     * @param query 简化的员工查询入参对象
     * @return ResponseDTO<List < VtDTO>>
     * @author xujie
     * @since 2021-05-17
     */
    ResponseDTO<List<VtDTO>> listDeptAndSubDeptStaffVtBySimpleQueryDIO(StaffSimpleQueryDIO query);

    /**
     * 根据指定简化的查询入参对象取得员工列表
     *
     * @param query 简化的员工查询入参对象 {@link StaffSimpleQueryDIO}
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffBySimpleQueryDIO(StaffSimpleQueryDIO query);

    /**
     * 描述: 分页查询员工简单信息
     *
     * @param query 简化的员工查询入参对象
     * @return ResponseDTO<List < PageDRO < StaffLittleDRO>>>
     * @author guoqiao
     * @since 2021/5/14 11:28
     */
    ResponseDTO<PageDRO<StaffLittleDRO>> listPageStaffByDIO(StaffQueryDIO query);

    /**
     * 根据指定信息取得员工列表
     *
     * @param keyword 文本信息，可以是员工账号/登录名、真实姓名、姓名拼音、手机号、电话、邮箱等
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByKeyword(String keyword, Integer status);

    /**
     * 根据指定角色取得员工列表
     *
     * @param roleId 角色ID
     * @param status 员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByRoleId(Integer roleId, Integer status);

    /**
     * 根据指定角色ID集合取得员工列表
     *
     * @param roleIds 角色ID集合
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByRoleIds(List<Integer> roleIds, Integer status);

    /**
     * 根据指定角色ID集合取得员工列表,同时包含员工角色
     *
     * @param roleIds 角色ID集合
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffSimpleDRO>> listStaffByRoleIdsIncludeRoleId(List<Integer> roleIds, Integer status);

    /**
     * 根据指定部门取得员工列表
     *
     * @param deptIds 部门ID，可以为一级部门ID、二级部门ID、三级部门ID
     * @param status  员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByDeptIds(List<Integer> deptIds, Integer status);

    /**
     * 根据指定部门取得员工列表
     *
     * @param deptIds 部门ID，可以为一级部门ID、二级部门ID、三级部门ID
     * @param status  员工状态，指停用、启用状态
     * @param number  返回数量限制
     * @return
     */
    ResponseDTO<List<VtDTO>> listStaffVtByDeptIdsAndNumber(List<Integer> deptIds, Integer status, Integer number);

    /**
     * 描述: 根据指定部门（本级及下级）取得员工（在职、启用、非工程师）id列表
     *
     * @param deptIds 部门ID集合，可以为一级部门ID、二级部门ID、三级部门ID
     * @return
     * @author guoqiao
     * @since 2021/3/5 17:52
     */
    ResponseDTO<List<Integer>> listStaffIdByDeptIds(List<Integer> deptIds);

    /**
     * 根据指定员工ID取得员工列表
     *
     * @param staffIds 员工ID
     * @param status   员工状态，指停用、启用状态
     * @return
     */
    ResponseDTO<List<StaffDRO>> listStaffByStaffIds(List<Integer> staffIds, Integer status);

    /**
     * 根据指定简化的查询入参对象取得员工列表
     *
     * @param query 简化的员工查询入参对象 {@link StaffSimpleQueryDIO}
     * @return
     */
    ResponseDTO<List<StaffDRO>> listSubAllDeptStaffBySimpleQueryDIO(StaffSimpleQueryDIO query);

    /**
     * 根据指定简化的查询入参对象取得员工列表（单个部门ID）
     *
     * @param query 简化的员工查询入参对象 {@link StaffSimpleQueryDIO}
     * @return
     */
    ResponseDTO<List<StaffDRO>> listSubAllDeptStaffByDeptId(StaffSimpleQueryDIO query);

    ResponseDTO<List<VtDTO>> listSubAllDeptStaffVtByDeptId(StaffSimpleQueryDIO query);


    ResponseDTO<OptionData<Integer>> listSubAllDeptStaffOptionsByDeptId(StaffSimpleQueryDIO query);

    /**
     * 北森系统查询员工信息
     *
     * @param baUserIds
     * @return
     */
    ResponseDTO<List<BsStaffDro>> listBsStaffByBsUserIds(List<Integer> baUserIds);


    /**
     * 北森系统员工信息更新
     *
     * @param staffInfoList
     * @return
     */
    ResponseDTO<String> saveBsStaffInfo(List<BsStaffDio> staffInfoList);


    /**
     * 员工是否具有某个url的功能权限
     *
     * @param staffId
     * @param url
     * @return
     */
    ResponseDTO<Boolean> checkPermitBySatffIdAndUrl(Integer staffId, String url);

    /**
     * 描述: 根据角色id列表，查询在指定部门的员工信息
     *
     * @param roleIds 角色id集合
     * @param deptId  部门id
     * @return ResponseDTO<List < StaffIdAndRealNameDRO>>
     * @author xujie
     * @since 2021/04/28
     **/
    @ApiOperation(value = "根据角色id列表，查询在指定部门的员工信息", notes = "员工id和姓名", response = StaffIdAndRealNameDRO.class)
    ResponseDTO<List<StaffIdAndRealNameDRO>> listByRoleIdsAndDeptId(@ApiParam(value = "角色id集合", required = true)
                                                                    @NotNull(message = "角色id集合不能为空")
                                                                    @Size(message = "角色id集合", min = 1, max = 500) List<Integer> roleIds,
                                                                    @ApiParam(value = "部门id", required = true)
                                                                    @NotNull(message = "部门id不能为空") Integer deptId);

    /**
     * 描述: 根据员工id集合查询钉钉Id
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDTalkId>
     * @author xujie
     * @since 2021/05/07
     **/
    @ApiOperation(value = "根据员工id集合查询钉钉Id", notes = "员工id和钉钉id", response = StaffIdAndDTalkIdDRO.class)
    ResponseDTO<List<StaffIdAndDTalkIdDRO>> listStaffIdAndDTalkIdByStaffIdList(@ApiParam(value = "员工id集合", required = true)
                                                                               @NotNull(message = "员工id集合不能为空")
                                                                               @Size(message = "员工id集合", min = 1, max = 500) List<Integer> staffIdList);


    /**
     * 描述: 根据员工邮箱查询员工钉钉ID
     *
     * @param
     * @return String
     * @author hedaiping
     * @since 2022/06/07
     **/
    @ApiOperation(value = "根据员工邮件地址查询员工钉钉ID", notes = "员工id和钉钉id", response = String.class)
    ResponseDTO<String> getDTalkIdByMail(@ApiParam(value = "员工邮箱", required = true) @NotBlank(message = "员工邮箱不能为空") String mail);


    /**
     * 查询状态正常的员工的北森用户ID
     *
     * @return 北森用户ID列表
     */
    ResponseDTO<List<StaffIdAndBsUserIdDRO>> listStaffIdAndBsUserId();

    /**
     * 更新员工工作时间
     *
     * @param list 员工工作时间列表
     * @return 更新成功返回 OK
     */
    ResponseDTO<String> saveStaffWorkTime(List<StaffWorkTimeDIO> list);

    /**
     * 描述: 使用一二级部门ID查询员工
     *
     * @param deptOneId  deptOneId
     * @param deptTwoIds deptTwoIds
     * @return com.zmn.common.dto2.ResponseDTO<java.util.List < com.zmn.mcc.common.dto.staff.StaffDRO>>
     * @author jiafei
     * @since 2022/7/27 15:46
     */
    ResponseDTO<List<StaffBriefDRO>> listSimpleStaffByDeptIds(Integer deptOneId, List<Integer> deptTwoIds);

    /**
     * 绑定账户查询接口
     *
     * @param staffId staffId
     * @return EngineerBasicInfoDRO
     */
    ResponseDTO<EngineerBasicInfoDRO> getEngineerByStaffId(Integer staffId);
}
